package edu.gatech.stolen.tea;

import java.util.ArrayList;

public class ItemHolder {
	
	private ArrayList<ArrayList<ToDoItem>> pUserItems;
	private ArrayList<ArrayList<ToDoItem>> wUserItems;
	private ArrayList<ArrayList<ToDoItem>> sUserItems;
	
	public ItemHolder(){
		
		pUserItems = new ArrayList<ArrayList<ToDoItem>>(26);
		wUserItems = new ArrayList<ArrayList<ToDoItem>>(26);
		sUserItems = new ArrayList<ArrayList<ToDoItem>>(26);
		
		for (int i0 = 0; i0 < 26; i0++){
			pUserItems.add(new ArrayList<ToDoItem>());
		}
		for (int i1 = 0; i1 < 26; i1++){
			wUserItems.add(new ArrayList<ToDoItem>());
		}
		for (int i2 = 0; i2 < 26; i2++){
			sUserItems.add(new ArrayList<ToDoItem>());
		}
		
	}
	
	public boolean add (ToDoItem item){
		
		ItemType type = item.getType();
		int i = item.getName().charAt(0) - 97;
		
		if (i < 0 || i > 25){
			return false;
		}
		
		if(type.equals(ItemType.PERSONAL)){
			if (!pUserItems.get(i).contains(item)){
				return pUserItems.get(i).add(item);
			}
		}
		else if(type.equals(ItemType.WORK)){
			if (!wUserItems.get(i).contains(item)){
				return wUserItems.get(i).add(item);
			}
		}
		else if(type.equals(ItemType.SCHOOL)){
			if (!sUserItems.get(i).contains(item)){
				return sUserItems.get(i).add(item);
			}
		}
		
		return false;
		
	}
	
	public boolean remove (ToDoItem item){
		
		ItemType type = item.getType();
		int i = item.getName().charAt(0) - 97;
		
		if (i < 0 || i > 25){
			return false;
		}
		
		if(type.equals(ItemType.PERSONAL)){
			return pUserItems.get(i).remove(item);
		}
		else if(type.equals(ItemType.WORK)){
			return wUserItems.get(i).remove(item);
		}
		else if(type.equals(ItemType.SCHOOL)){
			return sUserItems.get(i).remove(item);
		}
		
		return false;
		
	}
	
	public ToDoItem getItem (ToDoItem item){
		
		ItemType type = item.getType();
		int i = item.getName().charAt(0) - 97;
		
		if (i < 0 || i > 25){
			return null;
		}
		
		int index;
		
		if(type.equals(ItemType.PERSONAL)){
			index  = pUserItems.get(i).indexOf(item);
			if (index != -1){
				return pUserItems.get(i).get(index);
			}
		}
		else if(type.equals(ItemType.WORK)){
			index  = wUserItems.get(i).indexOf(item);
			if (index != -1){
				return wUserItems.get(i).get(index);
			}
		}
		else if(type.equals(ItemType.SCHOOL)){
			index  = sUserItems.get(i).indexOf(item);
			if (index != -1){
				return sUserItems.get(i).get(index);
			}
		}
		
		return null;
		
	}
	
	public ArrayList<ToDoItem> getLetter (String letter){
		
		int i = letter.charAt(0) - 97;
		
		if (i < 0 || i > 25){
			return null;
		}
		
		ArrayList<ToDoItem> items = new ArrayList<ToDoItem>();
		
		for (int ip = 0; ip < pUserItems.get(i).size(); ip++){
			items.add(pUserItems.get(i).get(ip));
		}
		for (int iw = 0; iw < wUserItems.get(i).size(); iw++){
			items.add(wUserItems.get(i).get(iw));
		}
		for (int is = 0; is < sUserItems.get(i).size(); is++){
			items.add(sUserItems.get(i).get(is));
		}
		
		return items;
		
	}
	
	public ArrayList<ToDoItem> getLetter (String letter, ItemType type){
		
		int i = letter.charAt(0) - 97;
		
		if (i < 0 || i > 25){
			return null;
		}
		
		ArrayList<ToDoItem> items = new ArrayList<ToDoItem>();
		
		if(type.equals(ItemType.PERSONAL)){
			for (int ip = 0; ip < pUserItems.get(i).size(); ip++){
				items.add(pUserItems.get(i).get(ip));
			}
		}
		else if(type.equals(ItemType.WORK)){
			for (int iw = 0; iw < wUserItems.get(i).size(); iw++){
				items.add(wUserItems.get(i).get(iw));
			}
		}
		else if(type.equals(ItemType.SCHOOL)){
			for (int is = 0; is < sUserItems.get(i).size(); is++){
				items.add(sUserItems.get(i).get(is));
			}
		}
		
		return items;
		
	}
	
	public ArrayList<ToDoItem> getType (ItemType type){
		
		ArrayList<ToDoItem> items = new ArrayList<ToDoItem>();
		
		if(type.equals(ItemType.PERSONAL)){
			for (int i0 = 0; i0 < 26; i0++){
				for (int ip = 0; ip < pUserItems.get(i0).size(); ip++){
					items.add(pUserItems.get(i0).get(ip));
				}
			}
		}
		else if(type.equals(ItemType.WORK)){
			for (int i1 = 0; i1 < 26; i1++){
				for (int iw = 0; iw < wUserItems.get(i1).size(); iw++){
					items.add(wUserItems.get(i1).get(iw));
				}
			}
		}
		else if(type.equals(ItemType.SCHOOL)){
			for (int i2 = 0; i2 < 26; i2++){
				for (int is = 0; is < sUserItems.get(i2).size(); is++){
					items.add(sUserItems.get(i2).get(is));
				}
			}
		}
		
		return items;
		
	}
	
	public ArrayList<ToDoItem> getDone(){
		
		ArrayList<ToDoItem> items = new ArrayList<ToDoItem>();
		
		for (int i0 = 0; i0 < 26; i0++){
			if (pUserItems.get(i0).size() != 0){
				for (int ip = 0; ip < pUserItems.get(i0).size(); ip++){
					if (pUserItems.get(i0).get(ip).isDone()){
						items.add(pUserItems.get(i0).get(ip));
					}
				}
			}
		}
		for (int i1 = 0; i1 < 26; i1++){
			if (wUserItems.get(i1).size() != 0){
				for (int iw = 0; iw < wUserItems.get(i1).size(); iw++){
					if (wUserItems.get(i1).get(iw).isDone()){
						items.add(wUserItems.get(i1).get(iw));
					}
				}
			}
		}
		for (int i2 = 0; i2 < 26; i2++){
			if (sUserItems.get(i2).size() != 0){
				for (int is = 0; is < sUserItems.get(i2).size(); is++){
					if (sUserItems.get(i2).get(is).isDone()){
						items.add(sUserItems.get(i2).get(is));
					}
				}
			}
		}
		
		return items;
		
	}
	
	public ArrayList<ToDoItem> getAll(){
		
		ArrayList<ToDoItem> items = new ArrayList<ToDoItem>();
		
		for (int i0 = 0; i0 < 26; i0++){
			if (pUserItems.get(i0).size() != 0){
				for (int ip = 0; ip < pUserItems.get(i0).size(); ip++){
					items.add(pUserItems.get(i0).get(ip));
				}
			}
		}
		for (int i1 = 0; i1 < 26; i1++){
			if (wUserItems.get(i1).size() != 0){
				for (int iw = 0; iw < wUserItems.get(i1).size(); iw++){
					items.add(wUserItems.get(i1).get(iw));
				}
			}
		}
		for (int i2 = 0; i2 < 26; i2++){
			if (sUserItems.get(i2).size() != 0){
				for (int is = 0; is < sUserItems.get(i2).size(); is++){
					items.add(sUserItems.get(i2).get(is));
				}
			}
		}
		
		return items;
		
	}
	
}
